home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 7
/
Aminet 7 - August 1995.iso
/
Aminet
/
comm
/
net
/
plip_3812src.lha
/
plip
/
src
/
int.asm
< prev
next >
Wrap
Assembly Source File
|
1994-03-02
|
2KB
|
166 lines
*
* interrupt-driver
*
section "text"
xdef _settimeout
TIMEOUT dc.l $4fffff
_settimeout:
lea TIMEOUT(pc),a0 ; 4 bytes
move.l d0,(a0) ; 2 bytes
rts
xdef _parinit
xdef _testbusy
xdef _setbusy
xdef _waitinputtoggle
xdef _outputtoggle
xdef _setciaoutput
xdef _sampleinput
xdef _testpout
xdef _setpout
xdef @intcode
currentinput: dc.w 0
iamclient: dc.w 0
_sampleinput:
lea currentinput(pc),a0
moveq #0,d0
move.w 2(a0),d0 ; iamclient
bchg #0,d0
btst.b d0,$bfd000
sne.b (a0) ; currentinput
rts
_waitinputtoggle:
lea currentinput(pc),a0
lea $bfd000,a1 ; ciaa
move.l TIMEOUT(pc),d1
moveq #0,d0
move.w 2(a0),d0 ; iamclient
bchg #0,d0
tst.b (a0)
beq.s inputnotset
itl1:
btst.b d0,(a1)
beq.s exa1
subq.l #1,d1
bpl.s itl1
exa1:
addq.l #1,d1
move.l d1,d0
beq.s rettt
clr.b (a0) ; currentinput
rts
inputnotset:
btst.b d0,(a1)
bne.s exa2
subq.l #1,d1
bpl.s inputnotset
exa2:
addq.l #1,d1
move.l d1,d0
beq.s rettt
move.b #42,(a0) ; currentinput
rettt:
rts
_outputtoggle:
moveq #0,d0
move.w iamclient(pc),d0
bchg.b d0,$bfd000
rts
_setciaoutput:
move.b #$ff,$bfe301 ; data out
rts
_testbusy:
moveq #0,d0
btst.b #0,$bfd000
sne d0
rts
_testpout:
moveq #0,d0
btst.b #1,$bfd000
sne d0
rts
_setbusy:
tst.l d0
bne.s sb1
bclr.b #0,$bfd000
rts
sb1:
bset.b #0,$bfd000
rts
_setpout:
tst.l d0
bne.s sp1
bclr.b #1,$bfd000
rts
sp1:
bset.b #1,$bfd000
rts
; Init parallel port
; d0==1 = client-mode
_parinit:
lea $bfd000,a0
; move.b #0,$bfe301 ; all parallel bits input
move.b #0,$bfe301-$bfd000(a0)
move.w d0,iamclient ; client?
beq.s servermode
bset.b #1,$200(a0) ; pout output
bclr.b #0,$200(a0) ; busy input
bclr.b #1,(a0) ; POUT low
rts
servermode:
bclr.b #1,$200(a0) ; pout input
bset.b #0,$200(a0) ; busy output
bset.b #0,(a0) ; BUSY high (send enable)
consetup:
rts
; Der eigentliche Interrupt-Server
; a1 = data
@intcode:
move.w (a1),d0 ; mode-word
btst #1,d0 ; sende?
beq.s recmode
return:
rts
; Empfangs-Modus: a1 = data, d0 = modes
recmode:
btst #2,d0 ; schon recmode?
bne.s return
; Prüfen, ob Arbitration richtig
btst #0,d0
bne.s clientrec
btst.b #1,$bfd000 ; POUT high?
bne.s recmodeok ; wenn nein, dann belegt
rts
clientrec:
btst.b #0,$bfd000 ; busy low?
bne.s return
recmodeok:
or.w #4,(a1) ; RECEIVE setzen
; load params
movem.l 4(a1),d0/a1/a6
; move.l 4(a1),d0
; move.l 8(a1),a1
; move.l 4,a6
jmp -324(a6) ; Signal (Empfangsbeginn)
END